package com.paisheng.justlife.utils;

import java.io.IOException;

public class CRCUtils {


    //CRC高位字节值表
    static byte[] auchCRCHi = {
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,
            (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,
            (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40
    };
    //CRC低位字节值表
    static byte[] auchCRCLo = {
            (byte)0x00,(byte)0xC0,(byte)0xC1,(byte)0x01,(byte)0xC3,(byte)0x03,(byte)0x02,(byte)0xC2,(byte)0xC6,(byte)0x06,(byte)0x07,(byte)0xC7,(byte)0x05,(byte)0xC5,(byte)0xC4,(byte)0x04,(byte)0xCC,(byte)0x0C,(byte)0x0D,(byte)0xCD,
            (byte)0x0F,(byte)0xCF,(byte)0xCE,(byte)0x0E,(byte)0x0A,(byte)0xCA,(byte)0xCB,(byte)0x0B,(byte)0xC9,(byte)0x09,(byte)0x08,(byte)0xC8,(byte)0xD8,(byte)0x18,(byte)0x19,(byte)0xD9,(byte)0x1B,(byte)0xDB,(byte)0xDA,(byte)0x1A,
            (byte)0x1E,(byte)0xDE,(byte)0xDF,(byte)0x1F,(byte)0xDD,(byte)0x1D,(byte)0x1C,(byte)0xDC,(byte)0x14,(byte)0xD4,(byte)0xD5,(byte)0x15,(byte)0xD7,(byte)0x17,(byte)0x16,(byte)0xD6,(byte)0xD2,(byte)0x12,(byte)0x13,(byte)0xD3,
            (byte)0x11,(byte)0xD1,(byte)0xD0,(byte)0x10,(byte)0xF0,(byte)0x30,(byte)0x31,(byte)0xF1,(byte)0x33,(byte)0xF3,(byte)0xF2,(byte)0x32,(byte)0x36,(byte)0xF6,(byte)0xF7,(byte)0x37,(byte)0xF5,(byte)0x35,(byte)0x34,(byte)0xF4,
            (byte)0x3C,(byte)0xFC,(byte)0xFD,(byte)0x3D,(byte)0xFF,(byte)0x3F,(byte)0x3E,(byte)0xFE,(byte)0xFA,(byte)0x3A,(byte)0x3B,(byte)0xFB,(byte)0x39,(byte)0xF9,(byte)0xF8,(byte)0x38,(byte)0x28,(byte)0xE8,(byte)0xE9,(byte)0x29,
            (byte)0xEB,(byte)0x2B,(byte)0x2A,(byte)0xEA,(byte)0xEE,(byte)0x2E,(byte)0x2F,(byte)0xEF,(byte)0x2D,(byte)0xED,(byte)0xEC,(byte)0x2C,(byte)0xE4,(byte)0x24,(byte)0x25,(byte)0xE5,(byte)0x27,(byte)0xE7,(byte)0xE6,(byte)0x26,
            (byte)0x22,(byte)0xE2,(byte)0xE3,(byte)0x23,(byte)0xE1,(byte)0x21,(byte)0x20,(byte)0xE0,(byte)0xA0,(byte)0x60,(byte)0x61,(byte)0xA1,(byte)0x63,(byte)0xA3,(byte)0xA2,(byte)0x62,(byte)0x66,(byte)0xA6,(byte)0xA7,(byte)0x67,
            (byte)0xA5,(byte)0x65,(byte)0x64,(byte)0xA4,(byte)0x6C,(byte)0xAC,(byte)0xAD,(byte)0x6D,(byte)0xAF,(byte)0x6F,(byte)0x6E,(byte)0xAE,(byte)0xAA,(byte)0x6A,(byte)0x6B,(byte)0xAB,(byte)0x69,(byte)0xA9,(byte)0xA8,(byte)0x68,
            (byte)0x78,(byte)0xB8,(byte)0xB9,(byte)0x79,(byte)0xBB,(byte)0x7B,(byte)0x7A,(byte)0xBA,(byte)0xBE,(byte)0x7E,(byte)0x7F,(byte)0xBF,(byte)0x7D,(byte)0xBD,(byte)0xBC,(byte)0x7C,(byte)0xB4,(byte)0x74,(byte)0x75,(byte)0xB5,
            (byte)0x77,(byte)0xB7,(byte)0xB6,(byte)0x76,(byte)0x72,(byte)0xB2,(byte)0xB3,(byte)0x73,(byte)0xB1,(byte)0x71,(byte)0x70,(byte)0xB0,(byte)0x50,(byte)0x90,(byte)0x91,(byte)0x51,(byte)0x93,(byte)0x53,(byte)0x52,(byte)0x92,
            (byte)0x96,(byte)0x56,(byte)0x57,(byte)0x97,(byte)0x55,(byte)0x95,(byte)0x94,(byte)0x54,(byte)0x9C,(byte)0x5C,(byte)0x5D,(byte)0x9D,(byte)0x5F,(byte)0x9F,(byte)0x9E,(byte)0x5E,(byte)0x5A,(byte)0x9A,(byte)0x9B,(byte)0x5B,
            (byte)0x99,(byte)0x59,(byte)0x58,(byte)0x98,(byte)0x88,(byte)0x48,(byte)0x49,(byte)0x89,(byte)0x4B,(byte)0x8B,(byte)0x8A,(byte)0x4A,(byte)0x4E,(byte)0x8E,(byte)0x8F,(byte)0x4F,(byte)0x8D,(byte)0x4D,(byte)0x4C,(byte)0x8C,
            (byte)0x44,(byte)0x84,(byte)0x85,(byte)0x45,(byte)0x87,(byte)0x47,(byte)0x46,(byte)0x86,(byte)0x82,(byte)0x42,(byte)0x43,(byte)0x83,(byte)0x41,(byte)0x81,(byte)0x80,(byte)0x40
    };
    /**
     * 计算CRC16校验
     * @Description:
     * @param data 需要计算的数组
     * @param len 长度
     * @return CRC16校验值
     */
    public static int calcCrc16(byte[] data, int len) {
        int uchCRCHi = 0xff;
        int uchCRCLo = 0xff;
        int uIndex;

        for(int i=0;i<len;++i){
            uIndex = (uchCRCHi ^ data[i]) & 0x00ff;
            uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
            uchCRCLo = auchCRCLo[uIndex];
        }
        return ((uchCRCHi & 0x00ff) << 8)|(uchCRCLo & 0x00ff) & 0xffff;
    }



    //测试
    public static void main(String[] args) throws IOException {
//        String data ="AA66041501";
//        String data1 ="AA660415040000ACC1";
//        String data1 ="AA66041504FFFFAD71";
//        String data1 ="AA66041504FFF92D73";
//        String substring = data1.substring(10, 12);
//        Short.parseShort(substring);
//        System.out.println(substring);
//        String totalmoney = new BigDecimal("0.08").multiply(new BigDecimal("1.20")).setScale(2,BigDecimal.ROUND_DOWN).toString();
//        System.out.println(totalmoney);
//        Integer i =65535;
//        byte b = i.byteValue();
//        String s = MyFunc.Byte2Hex(b);
//        System.out.println(s);

//        int i1 = MyFunc.HexToInt(substring);
//        System.out.println(i1);

//        String data ="AA66100202011001000000001E050012000074";
//        AA66100202011001000000001C03001300007536D5
//        byte[] bOutArray = MyFunc.HexToByteArr(data);
//        int crc16 = CRCUtils.calcCrc16(bOutArray,bOutArray.length);
//        System.out.println(crc16);
//        System.out.println(String.format("0x%04x", crc16).replace("0x",""));


//        System.out.println(String.format("0x%04x", crc16));
//        short s = (short)(Integer.valueOf("FFF9", 16) & 0xffff);
//        System.out.println(s);
//
//        System.out.println(Long.parseLong("0074", 2));
//        System.out.println(Long.parseLong("2F", 16));

//                                箱号 硬件版本  软件版本  设备状态   重量 箱满量  温度  烟感  风扇转速等级   风扇1转速   外设状态    CRC校验
//      String data = "AA66 10 02  02    01       1001     0000    0000   1E    05    00      12           00        0074       D54F";
//                     AA66 10 02  03    01       1001     0000    0000   1E    00    00      1C           00        0074       16F2
//                     AA66 11 02  04    01       03E9     0000    0005   00    1D    00      00           13        0000 35    537A
//        String data1 = "AA660314010051C9";
//        String substring = data.substring(data.length()-8, data.length()-4);
//        int hexToInt = MyFunc.HexToInt("1E");
//        String s = SubSrtingUtils.toBinaryString(hexToInt);
//        System.out.println(s);
//        System.out.println(data.substring(9,10));
//        System.out.println(data1.length());
//        String sMsg = "AA66041504FFFBACB2";
//        String str =  sMsg.substring(0, 10)+"0000";
//        byte[] bOutArray = MyFunc.HexToByteArr(str);
//        int crc16 = CRCUtils.calcCrc16(bOutArray,bOutArray.length);
//        String replace = str+String.format("0x%04x", crc16).replace("0x", "").toUpperCase();

        String data = "AA661102040103E900000005001D000013000035537A";
        String getHardwareVersions = data.substring(10, 12);
        String getSoftwareVersions = data.substring(12, 16);
        String getFacilityError = data.substring(16, 20);
        String getweight = data.substring(20, 24);
        String getBoorFUll = data.substring(24, 26);
        String getTemperature = data.substring(26, 28);
        String getCigarette = data.substring(28, 30);
        String getFanLevel = data.substring(30, 32);
        String getFanOne = data.substring(32, 34);
        String getFanTwo = data.substring(34, 36);
        String getFacilityOnOff = data.substring(36, 40);


        int hardwareVersions = MyFunc.HexToInt(getHardwareVersions);
        int softwareVersions = MyFunc.HexToInt(getSoftwareVersions);
        int facilityError = MyFunc.HexToInt(getFacilityError);
        int weight = MyFunc.HexToInt(getweight);
        int boorFUll = MyFunc.HexToInt(getBoorFUll);
        int temperature = MyFunc.HexToInt(getTemperature);
        int cigarette = MyFunc.HexToInt(getCigarette);
        int fanLevel = MyFunc.HexToInt(getFanLevel);
        int fanOne = MyFunc.HexToInt(getFanOne);
        int fanTwo = MyFunc.HexToInt(getFanTwo);
        int facilityOnOff = MyFunc.HexToInt(getFacilityOnOff);
        String tofacilityError = SubSrtingUtils.toBinaryString(facilityError);
        String tofacilityOnOff = SubSrtingUtils.toBinaryString(facilityOnOff);
        char[] chars = tofacilityError.toCharArray();
        char[] array = tofacilityOnOff.toCharArray();

        System.out.println(chars);
        System.out.println(array);
        System.out.println("硬件版本:"+hardwareVersions);
        System.out.println("软件版本:"+softwareVersions);
        System.out.println("设备状态:"+tofacilityError);
        System.out.println("重量:"+weight);
        System.out.println("箱满:"+boorFUll);
        System.out.println("温度:"+temperature);
        System.out.println("烟感:"+cigarette);
        System.out.println("风扇等级:"+fanLevel);
        System.out.println("风扇1转速:"+fanOne);
        System.out.println("风扇2转速:"+fanTwo);
        System.out.println("外设状态:"+facilityOnOff);



    }




}
